"""
AI 模型抽象基类

定义AI模型的统一接口和工厂模式。
"""

from abc import ABC, abstractmethod
from typing import Any, Dict, Optional, Iterator, Callable

from ..utils.config import Config


class AIModel(ABC):
    """AI模型抽象基类"""
    
    def __init__(self, config: Config) -> None:
        """
        初始化AI模型
        
        Args:
            config: 配置对象
        """
        self.config = config
        self.provider_config = config.get_provider_config()
    
    @abstractmethod
    def generate(self, prompt: str, stream: bool = False, **kwargs) -> str:
        """
        生成响应
        
        Args:
            prompt: 输入提示词
            stream: 是否使用流式API调用
            **kwargs: 其他参数
            
        Returns:
            生成的响应文本
        """
        pass
    
    def generate_with_callback(self, prompt: str, callback: Callable[[str], None], **kwargs) -> str:
        """
        使用回调函数生成响应（打字机效果）
        
        Args:
            prompt: 输入提示词
            callback: 回调函数，接收每个字符片段
            **kwargs: 其他参数
            
        Returns:
            生成的完整响应文本
        """
        # 默认实现：使用流式API，但通过回调实时输出
        complete_response = ""
        for chunk in self.generate_stream(prompt, **kwargs):
            callback(chunk)
            complete_response += chunk
        return complete_response
    
    @abstractmethod
    def generate_stream(self, prompt: str, **kwargs) -> Iterator[str]:
        """
        流式生成响应（返回迭代器）
        
        Args:
            prompt: 输入提示词
            **kwargs: 其他参数
            
        Yields:
            响应文本片段
        """
        pass
    
    @abstractmethod
    def is_available(self) -> bool:
        """
        检查模型是否可用
        
        Returns:
            模型是否可用
        """
        pass
    
    def get_model_info(self) -> Dict[str, Any]:
        """
        获取模型信息
        
        Returns:
            模型信息字典
        """
        return {
            "provider": self.config.get_provider(),
            "model": self.config.get_model(),
            "available": self.is_available()
        }


class ModelFactory:
    """AI模型工厂类"""
    
    _models = {}
    
    @classmethod
    def register(cls, provider: str, model_class: type) -> None:
        """
        注册模型类
        
        Args:
            provider: 提供商名称
            model_class: 模型类
        """
        cls._models[provider] = model_class
    
    @classmethod
    def create_model(cls, config: Config) -> AIModel:
        """
        创建模型实例
        
        Args:
            config: 配置对象
            
        Returns:
            AI模型实例
            
        Raises:
            ValueError: 不支持的提供商
        """
        provider = config.get_provider()
        
        if provider not in cls._models:
            raise ValueError(f"不支持的AI提供商: {provider}")
        
        model_class = cls._models[provider]
        return model_class(config)
    
    @classmethod
    def get_available_providers(cls) -> list:
        """
        获取可用的提供商列表
        
        Returns:
            提供商列表
        """
        return list(cls._models.keys())
